/**
 * @file srt_synchr.h
 * @author liuzl (zhanlin.liu@hopechart.com)
 * @brief 同步实例接口
 * @version 0.1
 * @date 2022-05-15
 * 
 * @copyright Copyright (c) Hangzhou Hopechart IoT {2009-2020}
 * 
 */
#ifndef __SRT_SYNCHR_H__
#define __SRT_SYNCHR_H__

#include "ofc_types.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef int (*SrtSynchr_TDoMsgSend)(const void *msg, int len);

/*
 * 同步状态
 */
enum TSrtSynchrStatusTag
{
    kSrtSynchrStNone,                   ///< 同步未开始
    kSrtSynchrStNotSupport,             ///< 不支持
    kSrtSynchrStOk,                     ///< 完成同步
    kSrtSynchrStSyncing,                ///< 正在同步
};
typedef enum TSrtSynchrStatusTag TSrtSynchrStatus;

/*
 * 同步信息
 */
typedef struct TSrtSynchrInfoTag TSrtSynchrInfo;
struct TSrtSynchrInfoTag
{
    UInt8 native_proto_ver;             ///< 本地协议版本
    UInt8 remote_proto_ver;             ///< 远端协议版本  0:未获取  >=1:协议版本 2及2以上支持同步完成通知

    UInt8 to_native_startup_status;     ///< 远端到本地的属性同步状态  @ref TSrtSynchrStatus
    UInt8 to_remote_startup_status;     ///< 本地到远程的属性同步状态  @ref TSrtSynchrStatus
};

/**
 * @brief 初始化
 * 
 * @note 依赖srt,所以srt应该先于本函数调用
 * @param slaver_mode 从模式，Flase表示主模式
 * @return int 
 */
int SrtSynchr_Init(Bool slaver_mode, SrtSynchr_TDoMsgSend do_send);

/**
 * @brief 去初始化
 * 
 * @return int 
 */
int SrtSynchr_DeInit(void);

/**
 * @brief 查询版本信息
 * 
 * @param version 版本
 * @note 最后一个字节为协议版本
 * @return int 成功返回0
 */
int SrtSynchr_GetVersion(UInt32 *version);

/**
 * @brief 主函数
 * 
 * @return int 
 */
int SrtSynchr_RunOnce(void);

/**
 * @brief 消息接收事件
 * 
 * @param msg 消息体
 * @param len 消息长度
 * @return int 结果
 */
int SrtSynchr_OnMsgRecv(void *msg, UInt16 len);

/**
 * @brief 对端属性是否完成同步
 * @return Ture:已完成  False:未完成
 * @note 不再支持
 */
//Bool SrtSynchr_IsStartupSynced(void);

/**
 * @brief 查询同步信息
 * @param info 同步信息
 * @return 获取是否成功
 */
Bool SrtSynchr_QueryInfo(TSrtSynchrInfo *info);

/**
 * @brief 设置首次同步超时时间
 * @param timeout 超时时间S  范围30 <= timeout <= 130
 * @return 获取是否成功
 */
Bool SrtSynchr_SetTimeOut(UInt8 timeout);

/**
 * @brief 当前等待同步的数据个数
 * @return >= 0 等待同步数据个数
 *         <  0 获取失败
 */
Int32 SrtSynchr_WaitSyncItemCount(void);

#ifdef __cplusplus
}
#endif

#endif//__SRT_SYNCHR_H__
